{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/AIRvePFS/dair/luoyz-data/Open_DAIR_BioMed'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os.path as osp\n",
    "import sys\n",
    "path = osp.dirname(osp.abspath(''))\n",
    "sys.path.append(path)\n",
    "sys.path.append(osp.join(path, \"open_biomed\"))\n",
    "path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/AIRvePFS/dair/luoyz-data/anaconda3/envs/biomedgpt/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n",
      "You are using the legacy behaviour of the <class 'transformers.models.t5.tokenization_t5.T5Tokenizer'>. This means that tokens that come after special tokens will not be properly handled. We recommend you to read the related pull request available at https://github.com/huggingface/transformers/pull/24565\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Config:  {'model': 'MolT5', 'data': {'mol': {'modality': ['structure', 'text'], 'featurizer': {'structure': {'name': 'transformer', 'transformer_type': 't5', 'model_name_or_path': '/AIRvePFS/dair/luoyz-data/Open_DAIR_BioMed/ckpts/text_ckpts/MolT5-base-caption2smiles', 'max_length': 512}, 'text': {'name': 'TransformerTokenizer', 'transformer_type': 't5', 'max_length': 512, 'model_name_or_path': '/AIRvePFS/dair/luoyz-data/Open_DAIR_BioMed/ckpts/text_ckpts/MolT5-base-caption2smiles'}}}}, 'network': {'smiles': {'model_name_or_path': '/AIRvePFS/dair/luoyz-data/Open_DAIR_BioMed/ckpts/text_ckpts/MolT5-base-caption2smiles', 'transformer_type': 't5', 'stop_grad': True}}}\n"
     ]
    }
   ],
   "source": [
    "# load data processor\n",
    "import json\n",
    "from open_biomed.utils.data_utils import DataProcessorFast\n",
    "from open_biomed.utils import fix_path_in_config\n",
    "from open_biomed.models.task_model.text2smi_model import Text2SMILESModel\n",
    "\n",
    "config = json.load(open(\"../configs/text2smi/molt5.json\", \"r\"))\n",
    "fix_path_in_config(config, path)\n",
    "print(\"Config: \", config)\n",
    "processor = DataProcessorFast(entity_type=\"text\", config=config[\"data\"][\"mol\"][\"featurizer\"][\"text\"])\n",
    "\n",
    "# load model\n",
    "model = Text2SMILESModel(config[\"network\"])\n",
    "model = model.eval()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The molecule is a trihydroxyflavone that is flavone with hydroxy groups at positions 5, 7 and 4' and methoxy groups at positions 3' and 6. Isolated from Salvia tomentosa and Artemisia asiatica, it exhibits anti-allergic, anti-inflammatory and apoptosis inducing activties. It has a role as a metabolite, an anti-inflammatory agent, an apoptosis inducer, an anti-allergic agent and an antineoplastic agent. It is a trihydroxyflavone and a dimethoxyflavone.\n",
      "Generated molecule:\n"
     ]
    },
    {
     "data": {
      "image/png": "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zby8vLi4uPz+osOHD9+8edPwBHd39+bNm+dfarVq1crV1fXx35ckMWnSpIULF3p5eR08eLB+/fomfGWlqzPf9evXDY8aPkIICgoKDAwsX758yS+YkJDQtm3bhISEcePG/fTTTyYs1e4xAMwuKyurZ8+eBw8ebNWq1d69ex/6aS6z/O+VkgqxsbGGR42+VwEBAZyFQMX57LPPPvjgAzc3tz179rRr187oqE6n0+l0phpemZqamt9fVPgRgoODQ+3atfNvbdu2bWs0sCctLa1z586nTp3q1q3b9u3bS9lPRQoGgHkJIZ599tkVK1bUqVPn0KFD1atXL3zO6NGjy5Urp4yia9Gihal+lx/p0Vzz5s1ry705KuVbs2bNyJEjAaxdu3ZIUdtm7dq166mnnjL8/LRp06bIz3YZpKennzx5Mv/WNjIy8t69e4YnKO+r3Nq2aNHi3Xff3blzp5+f34EDBypJvL172TAAzOudd96ZO3euh4fH/v37mzVrVviEnJwcd3d3w6e7Zhoycffu3ZMnT544cSIqKurEiRPR0dFGj5QdHBzq1Kmzfft2097vk23Zv3//U089de/eva+++uqNN94o8pzFixdPnDhRp9MZNtaqVSswMDB/NkCtWrVMUk92dnZ0dHT+5/bUqVN37941PEGr1Xp5eR0+fJhXMGXAADCjH374YcKECU5OTlu3bu1VzFpUubm5R44cMfxdzs7ONjyhRo0aht+runXrmqQ2o0dzW7duVe4PqlatavQsgeQRHx/fvn37GzduTJw48dsSN03M//woH6Hjx4+npKQYnlCxYsWmTZvmD1Fr1qyZSTpn9Hr9+fPnT/zjzz//zM7OfuWVV+bNm/f4Ly4hBoC5/P777wMGDMjLy/v555+ff/75Uv4to9/lQ4cOJScnG55gkiEThen1+rCwMOV+/+jRo61atXr81yTbcuvWrQ4dOpw7d65fv34bN250fMRNEw0f7R47duzvv/82PGo0q7Fly5YmeYSwfv36Z555Jigo6NixY4//ahJiAJhFdHR0p06d7ty5ExoaqsyhLzPD71VsbKzRGhJlGDJRglq1al29enXKlCmff/7549RMNicnJ6dv377h4eEtW7b8448/Hv9BVGJiomE/vtEjKGVWY/4QtXbt2nl5eZXhXbKzs729vW/fvh0XF8d5v2XAADC9xMTEdu3aXb16deTIkcuXLzft+m6PNGTiUR/NrV27NiQkpFWrVkePHjVhzWTlhBBjx4799ddfa9SocejQoSeeeMLkb5GWlnbq1Kn8W9tjx44ZdXWWeVbjuHHjFi9ePGPGjNDQUJOXbfcYACaWnp7epUuXqKiozp0779y50yT9MyW/XemHTDx01uW9e/e8vb3v3Llz9uzZJ5980qyVk/X44IMPPvvsM3d394iIiBYtWljgHY1mNUZFRWVkZBieUKlSJX9//9LMatyxY0efPn0aNWoUFxdngcrtDAPAlPLy8p555pmwsLD69esfOnTI8mv15OTkGA6ZOHnypNGQicqVK7ds2TL/kXKjRo2MvlfPP//80qVLP/744+nTp1u2dlLHTz/99OKLLzo6Om7ZsqV3796q1JCXl3f27Nn8z+2JEyeMHim7u7u3aNEiICCgX79+Tz/9tNHfrVGjRlJS0vHjxwMDAy1buO0TZDqvvPIKgKpVq547d07tWu5LSEgICwsLDQ0NDg42GlHq4OCQkZFhdP62bdsANG7cWJVqycLCw8OVwTnffPON2rUUoHxuZ8+ePWbMGMPb1jfeeKPwycr37t1337V8nbaOdwAm88UXX0yZMsXV1XX37t0dOnRQu5yiJSQk5F9nZWZmKj/3hnJzc5944omkpKSoqCjL9AaQWmJjYzt27Hj79u333ntv1qxZapdTklu3bil3Bm3btu3SpYvR0QMHDnTq1KlmzZqXLl3i+lePRu0EshNr167VarXKKv9q1/K4lH20p06dqnYhZEbXr19XZk6FhITk5eWpXc5j0ev1derUARAREaF2LTaGaWkCx44dGzt2rF6v//zzz0ePHq12OY9r1KhRAFasWCF4d2insrKyBg8efPny5TZt2ixevNjWr5o1Gs2IESMArFixQu1abAy7gB7XX3/91b59+6SkpJdeeun7779XuxwTEELUq1fv0qVLBw4csNq+LCozu9w08eTJkwEBAV5eXomJiY86hU1mtp38qrtz587AgQOTkpL69u27cOFCtcsxDY1GExISAl5P2ak333xzw4YNlStX3rp1q338+gNo0aKFv7//zZs3d+/erXYttsREAbBkCaZPR2JiEYf27MH06Th82Lhdp8PGjXjnHYwZg3HjEBqK/ftNU4yl6HS6oUOHRkdH+/v7r1y50p6uO5ReoFWrVuXm5qpdi9XIzcVP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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from rdkit import Chem\n",
    "from rdkit.Chem import Draw\n",
    "\n",
    "input_text = \"The molecule is a trihydroxyflavone that is flavone with hydroxy groups at positions 5, 7 and 4' and methoxy groups at positions 3' and 6. Isolated from Salvia tomentosa and Artemisia asiatica, it exhibits anti-allergic, anti-inflammatory and apoptosis inducing activties. It has a role as a metabolite, an anti-inflammatory agent, an apoptosis inducer, an anti-allergic agent and an antineoplastic agent. It is a trihydroxyflavone and a dimethoxyflavone.\"\n",
    "print(input_text)\n",
    "input = processor(input_text)\n",
    "with torch.no_grad():\n",
    "    smiles = model.decode({\"text\": input}, num_beams=5, max_length=512)[0]\n",
    "print(\"Generated molecule:\")\n",
    "Draw.MolsToGridImage(\n",
    "    [Chem.MolFromSmiles(smiles)], \n",
    "    molsPerRow=1, \n",
    "    subImgSize=(512, 512)\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.9.17 ('biomedgpt')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.17"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "c9acc99eda29845eb06fd58aaf0629edb79f58e739da13f56214d4672f20527d"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
